package com.ccubee.data.transfer.event;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.baomidou.mybatisplus.core.toolkit.StringPool;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 监听类型接口
 *
 * @Author ycf
 * @Date 2022/5/22 11:29
 * @Version 1.0
 */
public interface IEventType {
    String INSERT_SQL = "insert into %s(%s) values(%s);";
    String DELETE_SQL = "delete from  %s where %s;";
    String UPDATE_SQL = "update %s set %s where %s;";
    String INSERT_OR_UPDATE_SQL = "insert into %s(%s) values(%s) ON DUPLICATE KEY UPDATE %s;";
    String FORMAT_COLUM = "%s=%s";
    String SELECT_SQL = "select * from %s.%s %s ";

    /**
     * 监听类型
     *
     * @return 类型
     */
    CanalEntry.EventType evenType();

    /**
     * 执行命令
     *
     * @param cmd 参数
     */
    void cmd(Cmd cmd);

    /**
     * ON DUPLICATE KEY UPDATE %s=%s
     *
     * @param colum 字段列表
     * @return 拼接结果
     */
    default String onUpdateSql(List<String> colum) {
        return colum.stream().map(this::formatOnUpdateColum).collect(Collectors.joining(StringPool.COMMA));
    }

    /**
     * 键=值 %s=%s
     *
     * @param colum 字段列表
     * @param value 字段对应的值列表
     * @return 拼接结果
     */
    default String onUpdateSql(List<String> colum, List<Object> value) {
        return IntStream.range(0, colum.size())
                .mapToObj(i -> formatOnUpdateValue(colum.get(i), (String) value.get(i)))
                .collect(Collectors.joining(StringPool.COMMA));
    }

    /**
     * 格式化
     *
     * @param colum 字段名称
     * @return 名称
     */
    default String formatOnUpdateColum(String colum) {
        return String.format(FORMAT_COLUM, colum, colum);
    }

    /**
     * 格式化
     *
     * @param colum 字段名称
     * @return 名称
     */
    default String formatOnUpdateColumParam(String colum) {
        return String.format(FORMAT_COLUM, colum, "?");
    }

    /**
     * 格式化
     *
     * @param colum 字段名称
     * @param value 值
     * @return 名称
     */
    default String formatOnUpdateValue(String colum, String value) {
        return String.format(FORMAT_COLUM, colum, Objects.isNull(value) ? null : String.format("\"%s\"", value));
    }


}
